<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of CartManager
 *
 */
class ComprasManager {

// <editor-fold defaultstate="collapsed" desc="Atributos + Constantes">
    private static $instancia;
    private $iva;
    private $nro_factura;
    private $proveedor;

    const CANT_MINIMA=1;

// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Constructor + Singleton">
    static public function getInstance() {
        if (!self::$instancia instanceof self) {
            self::$instancia = new self;
        }
        return self::$instancia;
    }

    public function __construct() {
        $this->setIva(sfConfig::get('app_iva'));
    }

// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Propiedades">
    public function getIva() {
        return $this->iva;
    }

    public function getNroFactura() {
        return $this->nro_factura;
    }

    public function getProveedor() {
        return $this->proveedor;
    }

    public function setIva($iva) {

        if (!empty($iva)) {
            $this->iva = $iva;
            return true;
        }
        return false;
    }

    public function setNroFactura($nroFactura) {

        if (!empty($nroFactura)) {
            $this->nro_factura = $nroFactura;
            return true;
        }
        return false;
    }

    public function setProveedor(Proveedor $proveedor) {

        if (!empty($proveedor)) {
            $this->proveedor = $proveedor;
            return true;
        }
        return false;
    }

// </editor-fold>
// <editor-fold defaultstate="expanded" desc="Funciones">
    public function agregarProducto(Productos $producto, $cantidad=1) {

        $carro = sfContext::getInstance()->getUser()->getAttribute('compra');

        if (!empty($producto)) {

            if (!$this->productoExiste($producto)) {

                $carro[$producto->getProArticulo() . '.' . $producto->getProTalle()]["producto"] = $producto;

                if (!empty($carro[$producto->getProArticulo() . '.' . $producto->getProTalle()]["cantidad"])) {
                    $cantCarro = $carro[$producto->getProArticulo() . '.' . $producto->getProTalle()]["cantidad"];
                    $cantCarro = $cantCarro + $cantidad;
                    $carro[$producto->getProArticulo() . '.' . $producto->getProTalle()]["cantidad"] = $cantCarro;
                } else {
                    $carro[$producto->getProArticulo() . '.' . $producto->getProTalle()]["cantidad"] = $cantidad;
                }

                sfContext::getInstance()->getUser()->setAttribute('compra', $carro);

                return true;
            } else {
                $carro[$producto->getProArticulo() . '.' . $producto->getProTalle()]["cantidad"] = $cantidad;
            }
        }

        sfContext::getInstance()->getUser()->setAttribute('compra', $carro);

        return false;
    }

    public function productoExiste(Productos $producto) {

        $carro = sfContext::getInstance()->getUser()->getAttribute('compra');

        if (!empty($carro)) {
            $productoCarro = array_search($producto, $carro);

            if (!empty($productoCarro)) {
                return true;
            }
        }
        return false;
    }

    public function eliminarProducto(Productos $producto) {

        $carro = sfContext::getInstance()->getUser()->getAttribute('compra');

        if (!empty($producto)) {
            unset($carro[$producto->getProArticulo() . '.' . $producto->getProTalle()]);
            sfContext::getInstance()->getUser()->setAttribute('compra', $carro);
            //$carro[$producto->getProArticulo().'.'.$producto->getProTalle()]["cantidad"] = null;
            return true;
        }
        return false;
    }

    public function eliminarCantProducto(Productos $producto) {

        $cantidad = self::CANT_MINIMA;
        $carro = sfContext::getInstance()->getUser()->getAttribute('compra');

        if (!empty($producto)) {
            $cantCarro = $carro[$producto->getProArticulo() . '.' . $producto->getProTalle()]["cantidad"];
            $cantCarro -= $cantidad;
            $carro[$producto->getProArticulo() . '.' . $producto->getProTalle()]["cantidad"] = $cantCarro;
            if ($cantCarro == 0) {
                unset($carro[$producto->getProArticulo() . '.' . $producto->getProTalle()]);
            }

            sfContext::getInstance()->getUser()->setAttribute('compra', $carro);
            return true;
        }
        return false;
    }

    public function vaciarCarro() {
        sfContext::getInstance()->getUser()->setAttribute('compra', null);
    }

    public function getTotal() {

        $carro = sfContext::getInstance()->getUser()->getAttribute('compra');
        $subtotal = 0;
        if (!empty($carro)) {
            foreach ($carro as $producto) {

                $prod = $producto["producto"];
                $cant = $producto["cantidad"];
                $pro = $carro[$prod->getProArticulo() . '.' . $prod->getProTalle()]["producto"];
                $cant = $carro[$prod->getProArticulo() . '.' . $prod->getProTalle()]["cantidad"];

                $subtotal += $prod->getProPrecio() * $cant;
            }
            return $subtotal;
        } else {
            return false;
        }
    }

    public function checkOut($nroFactura, $proveedor, $fecha, $idCompra=null) {

        $carro = sfContext::getInstance()->getUser()->getAttribute('compra');

        $con = Propel::getConnection();

        try {
            //abrimos la transacción
            $con->beginTransaction();
            if (!empty($carro)) {

                //Obtener Total
                $total = 0;
                foreach ($carro as $producto) {

                    $prod = $producto["producto"];
                    $cant = $producto["cantidad"];

                    //Obtener Total
                    $total+=$prod->getProPrecio() * $cant;
                }

                //Se trata de una edicion
                if (!empty($idCompra)) {
                    $compra = ComprasPeer::existe($idCompra);
                //existe en BD? (edicion)
                     if ($compra) {
                      $compra = ComprasPeer::retrieveByPK($idCompra);

                          if (!empty($compra)) {
                          //Borrar detalle compra
                          $detalle = DetalleComprasPeer::BorrarDetalleDeCompra($idCompra);

                              if ($detalle) {
                              //eliminar compra
                              //$compraExiste->delete();

                              //actualizar valores
                              $compra->setCprNroFactura($nroFactura);
                              $compra->setCprProveedor($proveedor);
                              $compra->setCprTotal($total);
                              $compra->setCprFecha($fecha);
                              $compra->setCprUsuario(sfContext::getInstance()->getUser()->getGuardUser()->getId());
                              $compra->save();

                              }
                          }
                      }
                  }else{

                //Guardar Compra
                $compras = new Compras();
                $compras->setCprNroFactura($nroFactura);
                $compras->setCprProveedor($proveedor);
                $compras->setCprTotal($total);
                $compras->setCprFecha($fecha);
                $compras->setCprUsuario(sfContext::getInstance()->getUser()->getGuardUser()->getId());
                $cpra = $compras->save(); //var_dump($cpra); exit();
                $compra = ComprasPeer::obtenerCompra($nroFactura, $proveedor);
                }
                //Por cada producto de la compra
                //if (!empty($compra)) {
                    foreach ($carro as $producto) {

                        $prod = $producto["producto"];
                        $cant = $producto["cantidad"];

                        //Guardar Detalle
                        $detalle = new DetalleCompras();
                        $detalle->setDetCprArticulo($prod->getProArticulo());
                        $detalle->setDetCprTalle($prod->getProTalle());
                        $detalle->setDetCprCompra($compra->getCprId());
                        $detalle->setDetCprCantidad($cant);
                        $detalle->setDetCprPrecio($prod->getProPrecio());
                        $detalle->save();

                        //Actualizar Stock
                        $producto = ProductosPeer::retrieveByPK($prod->getProArticulo(), $prod->getProTalle());
                        if (!empty($producto)) {
                            $tipoCpr = sfConfig::get('app_caja_operacion_egreso');
                            $producto->actualizarStock($cant, $tipoCpr);
                        }
                    }
                //}

                //Agregar operacion
                $operacion = new Operaciones();
                $operacion->setOpMonto($total);
                $operacion->setOpMotivo("Compra - ID " . $compra->getCprId());
                $operacion->setOpTipo(sfConfig::get('app_caja_operacion_egreso'));
                $operacion->setOpUsuario(sfContext::getInstance()->getUser()->getGuardUser()->getId());
                $operacion->save();

                //$total = $subtotal * ($this->iva / 100);
            }
              //si todo va bien guardamos los cambios
            $con->commit();
            sfContext::getInstance()->getUser()->setFlash('notice', 'La compra se ha registrado exitosamente.');
            return true;
        } catch (sfPropelException $e) {

            // Hacemos rollback de los cambios en caso de fallo
            $con->rollBack();
            //devolvemos el error al depurador
            sfContext::getInstance()->getUser()->setFlash('error', 'La compra no pudo ser almacenada correctamente.');
            return false;
        }


    }


//        $con = Propel::getConnection();
//
//        try {
//            //abrimos la transacción
//            $con->beginTransaction();
//
//            //operaciones pertinentes contra la base de datos
//            if (!empty($carro)) {
//
//                //Obtener Total
//                $total = 0;
//                foreach ($carro as $producto) {
//
//                    $prod = $producto["producto"];
//                    $cant = $producto["cantidad"];
//
//                    //Obtener Total
//                    $total+=$prod->getProPrecio() * $cant;
//                }
//
//                //Guardar Compra
//                $compras = new Compras();
//                $compras->setCprNroFactura($nroFactura);
//                $compras->setCprProveedor($proveedor);
//                $compras->setCprTotal($total);
//                $compras->setCprFecha($fecha);
//                $compras->setCprUsuario(sfContext::getInstance()->getUser()->getGuardUser()->getId());
//                $cpra = $compras->save(); //var_dump($cpra); exit();
//                $compra = ComprasPeer::obtenerCompra($nroFactura, $proveedor);
//
//                //Por cada producto de la compra{
//                foreach ($carro as $producto) {
//
//                    $prod = $producto["producto"];
//                    $cant = $producto["cantidad"];
//
//                    //Guardar Detalle
//                    $detalle = new DetalleCompras();
//                    $detalle->setDetCprArticulo($prod->getProArticulo());
//                    $detalle->setDetCprTalle($prod->getProTalle());
//                    $detalle->setDetCprCompra($compra->getCprId());
//                    $detalle->setDetCprCantidad($cant);
//                    $detalle->setDetCprPrecio($prod->getProPrecio());
//                    $detalle->save();
//
//                    //Actualizar Stock
//                    $producto = ProductosPeer::retrieveByPK($prod->getProArticulo(), $prod->getProTalle());
//                    if (!empty($producto)) {
//                        $tipoCpr = sfConfig::get('app_caja_operacion_egreso');
//                        $producto->actualizarStock($cant, $tipoCpr);
//                    }
//                }
//
//                //Agregar operacion
//                $operacion = new Operaciones();
//                $operacion->setOpMonto($total);
//                $operacion->setOpMotivo("Compra - ID " . $compras->getCprId());
//                $operacion->setOpTipo(sfConfig::get('app_caja_operacion_egreso'));
//                $operacion->setOpUsuario(sfContext::getInstance()->getUser()->getGuardUser()->getId());
//                $operacion->save();
//
//                return true;
//            }
//            //si todo va bien guardamos los cambios
//            $con->commit();
//            sfContext::getInstance()->getUser()->setFlash('notice', 'La compra se ha registrado exitosamente.');
//            return true;
//        } catch (sfPropelException $e) {
//
//            // Hacemos rollback de los cambios en caso de fallo
//            $con->rollback();
//            //devolvemos el error al depurador
//            sfContext::getInstance()->getUser()->setFlash('error', 'La compra no pudo ser almacenada correctamente.');
//            return false;
//        }

    public function estaVacio() {
        $carro = sfContext::getInstance()->getUser()->getAttribute('compra');

        if (empty($carro)) {
            return true;
        }
        return false;
    }

// </editor-fold>
}

?>
